#ifndef MANEJADORXMLINFORME_H
#define MANEJADORXMLINFORME_H

#include <QXmlDefaultHandler>

#include "factoriaelementosimpresion.h"
#include "gestorvariables.h"
#include "informes_global.h"
#include "nodocompuesto.h"

class Informe;
class FragmentoImpresion;
class ElementoImpresion;

class INFORMES_EXPORT ManejadorXmlInforme : public QXmlDefaultHandler
{
public:
    ManejadorXmlInforme();
    ~ManejadorXmlInforme();

    bool startDocument();
    bool endElement(const QString& namespaceURI, const QString& localName, const QString& nombreTag);
    bool startElement(const QString& namespaceURI, const QString& localName, const QString &nombreTag, const QXmlAttributes &atributos);
    bool characters(const QString& texto);

    bool error(const QXmlParseException& exception);
    bool fatalError(const QXmlParseException & exception);

    NodoInforme* getNodoInformeCabecera() { return nodoInformeCabecera; }
    NodoInforme* getNodoInformeCuerpo() { return nodoInformeCuerpo; }
    NodoInforme* getNodoInformePie() { return nodoInformePie; }

protected:

    bool procesarAmbito(const QString& nombreTag);
    bool procesarDeclaracion(const QString& nombreTag, const QXmlAttributes& atributos);
    bool procesarElementoImpresion(const QString& nombreTag, const QXmlAttributes& atributos);

    bool parsearColor(const QString& textoColor, QColor& color);
    bool parsearBooleano(const QString& textoBooleano, bool& booleano);

    void agregarElemento(ElementoImpresion* elemento);
    void agregarNodo(NodoInforme* nodo);

    void apilarNodoCompuesto(NodoCompuesto* nodoCompuesto);
    void desapilarNodoCompuesto();
    NodoCompuesto* getNodoCompuestoActual();

    bool procesarTexto(const QString& texto);

    void error(const QString& mensaje);

private:
    //Informe* informe;
    GestorVariables gestorVariables;
    int ambito;

    NodoCompuesto* nodoInformeCabecera;
    NodoCompuesto* nodoInformeCuerpo;
    NodoCompuesto* nodoInformePie;
    QList<NodoCompuesto*> pilaNodos;
    FactoriaElementosImpresion factoriaElementosImpresion;
};

#endif // MANEJADORXMLINFORME_H
